# -*- coding: utf-8 -*-

import datetime, re

from django.utils.encoding import force_unicode

def is_ajax(request):
    if ',' in request.META['HTTP_ACCEPT']:
        return [x for x in request.META['HTTP_ACCEPT'].split(',') if x.strip() in ['application/xml', 'application/javascript', 'application/html+ajax']] and True
    return request.META['HTTP_ACCEPT'] in ['application/xml', 'application/javascript', 'application/html+ajax']

def ru_date(value):
    m = {
        1: u'января',
        2: u'февраля',
        3: u'марта',
        4: u'апреля',
        5: u'мая',
        6: u'июня',
        7: u'июля',
        8: u'августа',
        9: u'сентября',
        10: u'октября',
        11: u'ноября',
        12: u'декабря', 
    }
    if isinstance(value, datetime.date):
        month = m[value.month]
        return u'%i %s %i'% (value.day, month, value.year)
    return ''


def clean_phone(value):
    """
        Принимает список номеров телефонов и
        форматирует его
        
        arguments
        value -- строка со списком номеров
        
        return 
        string -- отформатированная (или пустая) строка
    """
    if re.match(ur'\+\d \((\d{5}\) \d|\d{4}\) \d{2}|\d{3}\) \d{3})-\d{2}-\d{2}', value, re.U):
        return value
            
    value = re.sub(ur'[^\d]*', '', value, re.U)
    if len(value) == 5: #Короткий Икрянинский номер
        value = re.sub(ur'(\d)(\d{2})(\d{2})', ur'+7 (85144) \1-\2-\3', value, re.U)
    elif len(value) < 10:
        value = ''
    else:
        if re.match(ur'^[78]?9', value, re.U):
            value = re.sub(ur'[78]?(\d{3})(\d{3})(\d{2})(\d{2})', ur'+7 (\1) \2-\3-\4', value, re.U)
        else:
            value = re.sub(ur'[78]?(\d{5})(\d)(\d{2})(\d{2})', ur'+7 (\1) \2-\3-\4', value, re.U)
        
    return value

def get_yandex_inflections(fio):
    import urllib, urllib2, json
    '''
        Используя онлайн-сервис Яндекс.Склонятор, склоняет ФИО и возвращает список ФИО во всех падежах
    '''
    
    url = u'http://export.yandex.ru/inflect.xml?format=json&name=%s' % urllib.quote(fio.encode('utf-8'))
    
    # Не нужно, чтоб оно по пол часа думало. 2 секунд задержки будет достаточно.
    urllib2.socket.setdefaulttimeout(2)
    
    try:
        json_data = urllib2.urlopen(force_unicode(url)).read()
    except Exception:
        return False
    
    arr = json.loads(json_data)
    return arr

def get_fio_initials(fio):
    words = fio.split(' ')
    words[1] = u'%s.' % words[1][0].upper()
    #TODO: сделать вменяемую обработку ошибки отсутствия данных
    try:
        words[2] = u'%s.' % words[2][0].upper()
    except Exception:
        pass
    return u' '.join(words)


import zipfile
import StringIO

from django import http
from django.template import Context, Template


def print_odf( request, odf_path, context ):
    """
      odf_path - path to the template document
      context - dictionary to create context from
    """
    c = Context()
    for key, value in context.items():
        if callable( value ):
            c[key] = value()
        else:
            c[key] = value
       
    # default mimetype
    mimetype = 'application/vnd.oasis.opendocument.text'
    # ODF is just a zipfile
    input = zipfile.ZipFile( odf_path, "r" )
    # we cannot write directly to HttpResponse, so use StringIO
    text = StringIO.StringIO()
    # output document
    output = zipfile.ZipFile( text, "a" )
       
    # go through the files in source
    for zi in input.filelist:
        out = input.read( zi.filename )
        # waut for the only interesting file
        if zi.filename == 'content.xml':
            # un-escape the quotes (in filters etc.)
            t = Template( out.replace( '&quot;', '"' ) ) 
            # render the document
            out = t.render( c ).encode('utf-8')
            
        elif zi.filename == 'mimetype':
            # mimetype is stored within the ODF
            mimetype = out 
        output.writestr( zi.filename, out )

    # close and finish
    output.close()
    return http.HttpResponse( content=text.getvalue(), mimetype=mimetype )